package com.zs.letcode.illustration_of_algorithm;


import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 剑指 Offer 50. 第一个只出现一次的字符
 * 在字符串 s 中找出第一个只出现一次的字符。如果没有，返回一个单空格。 s 只包含小写字母。
 * <p>
 * 示例:
 * <p>
 * s = "abaccdeff"
 * 返回 "b"
 * <p>
 * s = ""
 * 返回 " "
 * <p>
 * 限制：
 * <p>
 * 0 <= s 的长度 <= 50000
 * <p>
 * 相关标签
 * 队列
 * 哈希表
 * 字符串
 * 计数
 * <p>
 * 作者：Krahets
 * 链接：https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/5viisg/
 * 来源：力扣（LeetCode）
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 *
 * @author madison
 * @description
 * @date 2021/8/25 10:26
 */
public class Chapter52 {
    public static void main(String[] args) {

    }

    private class Solution {
        /**
         * 方法一：哈希表
         */
        public char firstUniqChar(String s) {
            Map<Character, Boolean> dic = new HashMap<>();
            char[] sc = s.toCharArray();
            for (char c : sc) {
                dic.put(c, !dic.containsKey(c));
            }
            for (char c : sc) {
                if (dic.get(c)) return c;
            }
            return ' ';
        }

        /**
         * 方法二：有序哈希表
         */
        public char firstUniqChar1(String s) {
            Map<Character, Boolean> dic = new LinkedHashMap<>();
            char[] sc = s.toCharArray();
            for (char c : sc)
                dic.put(c, !dic.containsKey(c));
            for (Map.Entry<Character, Boolean> d : dic.entrySet()) {
                if (d.getValue()) return d.getKey();
            }
            return ' ';
        }
    }
}
